// 返回 s 字典序最小的子序列，该子序列包含 s 的所有不同字符，且只包含一次。



// 示例 1：

// 输入：s = "bcabc"
// 输出："abc"
// 示例 2：

// 输入：s = "cbacdcbc"
// 输出："acdb"

var smallestSubsequence = function (s) {
  let len = s.length
  const charArray = s.split('')
  const lastIndex = new Array(26).fill(0)
  // 用于记录输入的字符串中每一个出现的字符 最后一次出现的下标
  for (let i = 0; i < len; i++) {
    lastIndex[charArray[i].charCodeAt() - '97'] = i
  }
  // 记录字母的排序结果
  const stack = []
  const visited = new Array(26).fill(false)
  for (let i = 0; i < len; i++) {
    // 如果某个字符在'栈'中 存在 则丢弃该字符串
    if (visited[charArray[i].charCodeAt() - 97]) {
      continue
    }
    // '栈顶'元素的ascii 码值 ,比当前元素的ascii 值大 && '栈顶' 元素在之后还会出现
    while (stack.length > 0 && stack[stack.length - 1] > charArray[i] && lastIndex[stack[stack.length - 1].charCodeAt() - 97] > i) {
      const top = stack.pop()
      visited[top.charCodeAt() - 97] = false
    }
    stack.push(charArray[i])
    visited[charArray[i].charCodeAt() - 97] = true
  }
  return stack.join('')
}
console.log(smallestSubsequence('bcabc')); // 输出 "abc"
